#ifndef __TEXTURASFANTASMA_H__
#define __TEXTURASFANTASMA_H__

#include "Textura.h"
#include "Lista.h"

using namespace std;

/**
 * Clase cuya instancia representa un personaje a mostrar en la pantalla
 */
class TexturasFantasma : public TexturasPersonaje{

private: 

	Lista<Textura>* perseguido ;
	NodoLista<Textura>* siguientePerseguido ;

		Lista<Textura>* muerto ;
	NodoLista<Textura>* siguienteMuerto ;

		Lista<Textura>* sigueOtro ;
	NodoLista<Textura>* siguienteSigueOtro ;
	

	// "Primero =true" sirve para reemplazar el primero de la lista
	// ya que el constructor lo carga por defecto con el Path de la primera img
	void addTexturaLista(Lista<Textura>* listaText, const string& path, const string& alpha, bool primero){
		
		Textura* textura= new Textura("FANTASMA", path ,0,0,0,0,alpha,0,0);
		textura->getImagen()->redimensionar(Contenido::getAltoContenido(),Contenido::getAnchoContenido());

		if(primero){
			listaText->getPrimero()->setDato(textura);
		}else{
			listaText->agregar(textura);
		}
	}

public:

	// La textura por default
	// 
	TexturasFantasma(const string& path, const string& alpha){
		
		this->inicializar();

		Textura* textura = new Textura("FANTASMA1", path ,0,0,0,0,alpha,0,0);
		textura->getImagen()->redimensionar(Contenido::getAltoContenido(),Contenido::getAnchoContenido());

		this->arriba->agregar(textura);
		this->abajo->agregar(textura);
		this->izquierda->agregar(textura);
		this->derecha->agregar(textura);
		
		this->perseguido = new Lista<Textura> ;
		this->siguientePerseguido = 0 ;

		this->muerto = new Lista<Textura> ;
		this->siguienteMuerto = 0 ;

		this->sigueOtro = new Lista<Textura>;
		this->siguienteSigueOtro = 0;
	
	}


	// "primero =true" sirve para reemplazar el primero de la lista
	// ya que el constructor lo carga por defecto con el Path de la primera img
	
	void addTexturaArriba(const string& path, const string& alpha, bool primero){
		this->addTexturaLista(this->arriba, path, alpha, primero);
	}

	void addTexturaAbajo(const string& path, const string& alpha, bool primero){
		this->addTexturaLista(this->abajo, path, alpha, primero);
	}

	void addTexturaIzquierda(const string& path, const string& alpha, bool primero){
		this->addTexturaLista(this->izquierda, path, alpha, primero);
	}

	void addTexturaDerecha(const string& path, const string& alpha, bool primero){
		this->addTexturaLista(this->derecha, path, alpha, primero);
	}

	void addTexturaArriba(const string& path, const string& alpha){
		this->addTexturaLista(this->arriba, path, alpha, false);
	}

	void addTexturaAbajo(const string& path, const string& alpha){
		this->addTexturaLista(this->abajo, path, alpha, false);
	}

	void addTexturaIzquierda(const string& path, const string& alpha){
		this->addTexturaLista(this->izquierda, path, alpha, false);
	}

	void addTexturaDerecha(const string& path, const string& alpha){
		this->addTexturaLista(this->derecha, path, alpha, false);
	}

	void addTexturaPerseguido(const string& path, const string& alpha){
		this->addTexturaLista(this->perseguido, path, alpha, false);
	}

	void addTexturaMuerto(const string& path, const string& alpha){
		this->addTexturaLista(this->muerto, path, alpha, false);
	}

	void addTexturaSigueOtro(const string& path, const string& alpha){
		this->addTexturaLista(this->sigueOtro, path, alpha, false);
	}
	
	Textura* getSiguientePerseguido(){
		this->actualizarMedidasAnterior(this->siguientePerseguido);

		if(!this->siguientePerseguido || !this->siguientePerseguido->tieneSiguiente()){
			this->siguientePerseguido = this->perseguido->getPrimero();
			this->primeroConsultado = this->siguientePerseguido ;
		}else{
			this->siguientePerseguido = this->siguientePerseguido->getSiguiente();
		}
		this->ultimoConsultado = this->siguientePerseguido ;
		return this->siguientePerseguido->getDato();
	}

	Textura* getSiguienteMuerto(){
		this->actualizarMedidasAnterior(this->siguienteMuerto);

		if(!this->siguienteMuerto || !this->siguienteMuerto->tieneSiguiente()){
			this->siguienteMuerto = this->muerto->getPrimero();
			this->primeroConsultado = this->siguienteMuerto ;
		}else{
			this->siguienteMuerto = this->siguienteMuerto->getSiguiente();
		}
		this->ultimoConsultado = this->siguienteMuerto ;
		return this->siguienteMuerto->getDato();
	}


	Textura* getSiguienteSigueOtro(){
		this->actualizarMedidasAnterior(this->siguienteSigueOtro);

		if(!this->siguienteSigueOtro || !this->siguienteSigueOtro->tieneSiguiente()){
			this->siguienteSigueOtro = this->sigueOtro->getPrimero();
			this->primeroConsultado = this->siguienteSigueOtro ;
		}else{
			this->siguienteSigueOtro = this->siguienteSigueOtro->getSiguiente();
		}
		this->ultimoConsultado = this->siguienteSigueOtro ;
		return this->siguienteSigueOtro->getDato();
	}

	~TexturasFantasma(){
		delete this->perseguido;
		delete this->muerto;
	}
};

#endif